Optimize Docker build with dependency layer caching#36864
Merged
silverwind merged 3 commits intogo-gitea:mainfrom Mar 8, 2026
Merged
Optimize Docker build with dependency layer caching#36864silverwind merged 3 commits intogo-gitea:mainfrom
silverwind merged 3 commits intogo-gitea:mainfrom
Conversation
Copy dependency manifests (package.json, pnpm-lock.yaml, .npmrc for npm; go.mod, go.sum for Go) before the full source copy so that dependency installation gets its own cached layer. When only source code changes, the dependency layers are reused. Also remove the GOPROXY=direct override which was bypassing the Go module proxy, causing build failures when gitea.com was unreachable. The Go default (https://proxy.golang.org,direct) is now used instead. Co-Authored-By: Claude (Opus 4.6) <noreply@anthropic.com>
The node_modules directory created by pnpm install always has a newer mtime than the pnpm-lock.yaml copied from the build context, so make already sees node_modules as up-to-date. Co-Authored-By: Claude (Opus 4.6) <noreply@anthropic.com>
Contributor
There was a problem hiding this comment.
Pull request overview
This PR updates the project Docker build to improve build caching and reliability by separating dependency installation into its own cached layers and by reverting Go module fetching to the default proxy behavior.
Changes:
- Frontend: copy
package.json/pnpm-lock.yaml/.npmrcfirst and runpnpm installbefore copying the rest of the source. - Backend: copy
go.mod/go.sumfirst and rungo mod downloadbefore copying the full source tree. - Remove the
GOPROXY=directbuild-arg override so Go uses its default proxy configuration.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.
| File | Description |
|---|---|
| Dockerfile | Adds separate cached layers for pnpm/go module dependencies; removes GOPROXY=direct. |
| Dockerfile.rootless | Mirrors the same dependency-layer caching and GOPROXY change for the rootless image. |
Comments suppressed due to low confidence (2)
Dockerfile:18
ARG GITEA_VERSION/TAGS/CGO_EXTRA_CFLAGSare declared before theCOPY go.mod go.sum+go mod downloaddependency layer. With BuildKit, changing any of these build-args can invalidate the cache for subsequent RUN steps, defeating the intended module-download caching when only the version/tags change. Consider moving these ARG/ENV declarations to just beforemake backendso thego mod downloadlayer only depends on go.mod/go.sum (and base image/apk deps).
ARG GITEA_VERSION
ARG TAGS="sqlite sqlite_unlock_notify"
ENV TAGS="bindata timetzdata $TAGS"
ARG CGO_EXTRA_CFLAGS
Dockerfile.rootless:18
- Same caching concern here: build args (
GITEA_VERSION/TAGS/CGO_EXTRA_CFLAGS) are declared before thego mod downloadlayer, so varying them can invalidate the module download cache even when go.mod/go.sum are unchanged. Moving the ARG/ENV declarations to just beforemake backendwould keep the dependency layer reusable across version/tag-only rebuilds.
ARG GITEA_VERSION
ARG TAGS="sqlite sqlite_unlock_notify"
ENV TAGS="bindata timetzdata $TAGS"
ARG CGO_EXTRA_CFLAGS
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
TheFox0x7
approved these changes
Mar 8, 2026
lunny
approved these changes
Mar 8, 2026
silverwind
added a commit
to silverwind/gitea
that referenced
this pull request
Mar 8, 2026
* origin/main: Optimize Docker build with dependency layer caching (go-gitea#36864) Fix URLJoin, markup render link reoslving, sign-in/up/linkaccount page common data (go-gitea#36861) Fix CodeQL code scanning alerts (go-gitea#36858) Refactor auth middleware (go-gitea#36848) Update Nix flake (go-gitea#36857) Update JS deps (go-gitea#36850) Load `mentionValues` asynchronously (go-gitea#36739) [skip ci] Updated translations via Crowdin
silverwind
added a commit
to silverwind/gitea
that referenced
this pull request
Mar 8, 2026
* main: (26 commits) Clean up `refreshViewedFilesSummary` (go-gitea#36868) Remove `util.URLJoin` and replace all callers with direct path concatenation (go-gitea#36867) Optimize Docker build with dependency layer caching (go-gitea#36864) Fix URLJoin, markup render link reoslving, sign-in/up/linkaccount page common data (go-gitea#36861) Fix CodeQL code scanning alerts (go-gitea#36858) Refactor auth middleware (go-gitea#36848) Update Nix flake (go-gitea#36857) Update JS deps (go-gitea#36850) Load `mentionValues` asynchronously (go-gitea#36739) [skip ci] Updated translations via Crowdin Fix dbfs error handling (go-gitea#36844) Fix OAuth2 authorization code expiry and reuse handling (go-gitea#36797) Fix org permission API visibility checks for hidden members and private orgs (go-gitea#36798) Fix non-admins unable to automerge PRs from forks (go-gitea#36833) upgrade to github.com/cloudflare/circl 1.6.3, svgo 4.0.1, markdownlint-cli 0.48.0 (go-gitea#36837) Fix dump release asset bug (go-gitea#36799) build(deps): update material-icon-theme v5.32.0 (go-gitea#36832) Fix bug to check whether user can update pull request branch or rebase branch (go-gitea#36465) Fix forwarded proto handling for public URL detection (go-gitea#36810) Fix artifacts v4 backend upload problems (go-gitea#36805) ... # Conflicts: # pnpm-lock.yaml
zjjhot
added a commit
to zjjhot/gitea
that referenced
this pull request
Mar 10, 2026
* giteaofficial/main: Update minimum go version to 1.26.1, golangci-lint to 2.11.2, fix test style (go-gitea#36876) Add render cache for SVG icons (go-gitea#36863) Fix incorrect viewed files counter if reverted change was viewed (go-gitea#36819) [skip ci] Updated translations via Crowdin Clean up `refreshViewedFilesSummary` (go-gitea#36868) Remove `util.URLJoin` and replace all callers with direct path concatenation (go-gitea#36867) Optimize Docker build with dependency layer caching (go-gitea#36864) Fix URLJoin, markup render link reoslving, sign-in/up/linkaccount page common data (go-gitea#36861) Fix CodeQL code scanning alerts (go-gitea#36858) Refactor auth middleware (go-gitea#36848) Update Nix flake (go-gitea#36857) Update JS deps (go-gitea#36850) Load `mentionValues` asynchronously (go-gitea#36739) [skip ci] Updated translations via Crowdin Fix dbfs error handling (go-gitea#36844) Fix OAuth2 authorization code expiry and reuse handling (go-gitea#36797) Fix org permission API visibility checks for hidden members and private orgs (go-gitea#36798)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
GOPROXY=directoverride which was bypassing the Go module proxy, causing build failures when git servers are unreachable. The Go default (https://proxy.golang.org,direct) is now used instead.